//package com.source.sql;
//
//import cn.hutool.core.map.MapUtil;
//import cn.hutool.core.util.StrUtil;
//import com.sun.deploy.util.StringUtils;
//import java.io.BufferedReader;
//import java.io.FileReader;
//import java.io.IOException;
//import java.nio.file.Files;
//import java.nio.file.Paths;
//import java.nio.file.StandardOpenOption;
//import java.util.ArrayList;
//import java.util.HashMap;
//import java.util.List;
//import java.util.Map;
//import java.util.Scanner;
//
///**
// * sqlcomparator
// *
// * @author wangchangjie
// * @date 2024/03/07
// */
//public class SQLComparator {
//
//    public static void main(String[] args) {
//        LogUtil.printf("1.请输入需要对比的数据库名字：");
//        Scanner scanner = new Scanner(System.in);
//        String database = scanner.next();
//        System.out.printf(
//            "2.请输分销环境 %s 库的sql文件地址(全路径比如：D:\\data\\javaLearn\\hive_test_md.sql)%n",
//            database);
//        String fileMd = scanner.next();
//        System.out.printf(
//            "3.请输行业环境 %s 库的sql文件地址(全路径比如：D:\\data\\javaLearn\\hive_test_hy.sql)%n",
//            database);
//        String fileHy = scanner.next();
////        String fileHy = "D:\\data\\javaLearn\\analyze\\src\\main\\java\\com\\source\\sql\\static\\hive_test_hy.sql";
////        String fileMd = "D:\\data\\javaLearn\\analyze\\src\\main\\java\\com\\source\\sql\\static\\hive_test_md.sql";
//
//        LogUtil.printf(
//            String.format("4.请输入markdown文件生成的地址(全路径比如：D:\\data\\javaLearn)"));
//        String path = scanner.next();
//
//        Map<String, TableInfo> tableMapHy = readTableInfo(fileHy);
//        Map<String, TableInfo> tableMapMd = readTableInfo(fileMd);
//
//        List<Result> results = compareTables(tableMapMd, tableMapHy);
//        // 转成markdown文档
//        ResultMarkdown markdown = new ResultMarkdown();
//
//        List<Result> right = new ArrayList<>();
//        List<Result> empty = new ArrayList<>();
//        List<Result> error = new ArrayList<>();
//        List<Result> useless = new ArrayList<>();
//        // 选出无需改动的表
//        for (Result result : results) {
//            if (result.getTableMdSourceName().contains("空字段表") || result.getTableHyTargetName().contains("空字段表")){
//                useless.add(result);
//            }else if (result.getDiscrepancy().equals(DiscrepancyEnum.STRUCTURAL_CONSISTENCY.getDesc())) {
//                right.add(result);
//            } else if (result.getDiscrepancy().equals("表缺失")) {
//                empty.add(result);
//            } else {
//                error.add(result);
//            }
//        }
//        List<Result> arrayList = new ArrayList<>();
//        arrayList.addAll(useless);
//        arrayList.addAll(right);
//        arrayList.addAll(empty);
//        arrayList.addAll(error);
//
//        int idnex = 1;
//        for (Result result : arrayList) {
//            StringBuilder sb = new StringBuilder();
//            sb
//                .append("|").append(idnex++)
//                .append("|").append(result.getNumber())
//                .append("|").append(result.getTableMdSourceName())
//                .append("|").append(result.getTableHyTargetName())
//                .append("|").append(result.getDiscrepancy())
//                .append("|").append("")
//                .append("|").append(result.getRemark())
//                .append("|");
//            markdown.getLines().add(sb.toString());
//        }
//        String fileName =
//            path + "\\" + "sql分销和行业差异信息-" + database + "库-" + System.currentTimeMillis()
//                + ".md";
//        List<String> lines = new ArrayList<>();
//        lines.add("# sql分销和行业差异信息-hive库");
//        lines.add("> 数据对比如下");
//        lines.add("> ");
//        lines.add("> 一：分销相对行业的差异（重视）");
//        lines.add("> ");
//        lines.add("> 二：行业相对分销的差异（结合业务要求判定重要程度）");
//        lines.add(" ");
//        lines.add(markdown.getHeader());
//        lines.add(markdown.getDemarcation());
//        lines.addAll(markdown.getLines());
//
//        try {
//            Files.write(Paths.get(fileName), lines, StandardOpenOption.CREATE);
//            LogUtil.printf("文件已成功创建并写入。");
//        } catch (IOException e) {
//            e.printStackTrace();
//        }
//    }
//
//    private static Map<String, TableInfo> readTableInfo(String filename) {
//        Map<String, TableInfo> tableMap = new HashMap<>();
//        try (BufferedReader br = new BufferedReader(new FileReader(filename))) {
//            String line;
//            String tableName = null;
//            TableInfo tableInfo = null;
//            while ((line = br.readLine()) != null) {
//                if (line.isEmpty()) {
//                    continue;
//                }
//                if (line.contains("CREATE TABLE")) {
//                    if (tableName != null) {
//                        // 上个表还没关闭
//                    }
//                    tableName = extractTableName(line);
//                    tableInfo = new TableInfo(tableName);
//                    if (line.contains(");") || line.contains(") ENGINE")) {
//                        // 无字段的表
//                        tableInfo.setValid(false);
//                        tableMap.put(tableName+"-空字段表", tableInfo);
//                    }
//                } else if (line.contains("`") && !line.contains("DROP TABLE") && line.trim()
//                    .startsWith("`")) {
//                    String columnName = extractColumnName(line);
//                    String columnType = extractColumnType(line);
//                    tableInfo.addColumn(columnName, columnType, line);
//                } else if (line.contains(");") || line.contains(") ENGINE") || line.startsWith(
//                    ") ")) {
//                    tableMap.put(tableName, tableInfo);
//                } else if (tableInfo != null) {
//                    if (MapUtil.isEmpty(tableInfo.getColumns())) {
//                        tableInfo.setValid(false);
//                    }
//                    tableInfo.addOtherInfo(line);
//                }
//            }
//        } catch (IOException e) {
//            e.printStackTrace();
//        }
//        return tableMap;
//    }
//
//    private static String extractTableName(String line) {
//        return line.substring(line.indexOf("`") + 1, line.lastIndexOf("`"));
//    }
//
//    private static String extractColumnName(String line) {
//        return line.substring(line.indexOf("`") + 1, line.lastIndexOf("`"));
//    }
//
//    private static String extractColumnType(String line) {
//        line = line.trim();
//        int spaceCount = 0;
//        int secondSpaceIndex = -1;
//
//        for (int i = 0; i < line.length(); i++) {
//            if (line.charAt(i) == ' ') {
//                spaceCount++;
//                if (spaceCount == 2) {
//                    secondSpaceIndex = i;
//                    break;
//                }
//            }
//        }
//        if (secondSpaceIndex != -1) {
//            return line.substring(line.lastIndexOf("`") + 2, secondSpaceIndex);
//        } else {
//            LogUtil.printf("字符串中不足两个空格:" + line);
//        }
//        return null;
//    }
//
//
//    /**
//     * 比较表 表：需要分销的表都要在行业中存在 字段：行业字段多可以，但是能不能少字段 insert插入指定字段即可，但是要确保，行业多的字段有默认值！
//     *
//     * @param tableMapMd 表映射md
//     * @param tableMapHy 表图
//     */
//    private static List<Result> compareTables(Map<String, TableInfo> tableMapMd,
//        Map<String, TableInfo> tableMapHy) {
//        List<Result> results = new ArrayList<>();
//        for (Map.Entry<String, TableInfo> entry : tableMapMd.entrySet()) {
//            Result result = new Result();
//            String tableName = entry.getKey();
//            TableInfo tableInfoMd = entry.getValue();
//            result.setTableMdSourceName(tableName);
//            if (!tableMapHy.containsKey(tableName)) {
//                LogUtil.printf(String.format("行业中没有表 %s", tableName));
//                result.setTableHyTargetName("行业中无此表");
//                result.setDiscrepancy("表缺失");
//                results.add(result);
//                continue;
//            } else {
//                result.setTableHyTargetName(tableName);
//            }
//            TableInfo tableInfoHy = tableMapHy.get(tableName);
//            // 比较字段 分销调用
//            String difference = tableInfoMd.compare(tableInfoHy);
//            if (StrUtil.isNotBlank(difference)) {
//                result.setDiscrepancy(difference);
//            }
//            results.add(result);
//        }
//        for (Map.Entry<String, TableInfo> entry : tableMapHy.entrySet()) {
//            Result result = new Result();
//            String tableName = entry.getKey();
//            result.setTableHyTargetName(tableName);
//            if (!tableMapMd.containsKey(tableName)) {
//                LogUtil.printf(String.format("分销中没有表 %s", tableName));
//                result.setTableMdSourceName("分销中无此表");
//                result.setDiscrepancy("表缺失");
//                results.add(result);
//            }
//        }
//        return results;
//    }
//}